package rmmk.algorithms.features;

import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import rmmk.framework.datasources.Document;

public class PairsOfWordsGlobal {

	Logger logger = LoggerFactory.getLogger(PairsOfWordsGlobal.class);
	HashMap<String, Integer> pairOfWords = new HashMap<>();
	
	public void calculate(List<Document> documents) {
		
		for(Document doc : documents)
		{
			for(int i = 0; i < doc.getExtractedWords().size()-1; ++i)
			{
				this.checkIfContainsAndAdd(doc.getExtractedWords().get(i), 
						doc.getExtractedWords().get(i+1));
			}
		}
		
		int max = 0;
		
		for(Entry<String, Integer> e : pairOfWords.entrySet())
			if(e.getValue() > max) max = e.getValue();
		
		logger.info("Ilość zliczonych par słów: " + pairOfWords.size());
		logger.info("Maksymalna częstość wystąpień pary słów: " + max);
	
		int limit = max - (max / 4);
		
		for(Entry<String, Integer> e : pairOfWords.entrySet())
			if(e.getValue() < limit) pairOfWords.remove(e.getKey());
		
		logger.info("Ilość par słów w bazie po odrzuceniu części: " + pairOfWords.size());
	}
	
	private void  checkIfContainsAndAdd(String a, String b)
	{
		if(pairOfWords.containsKey(a+b) || pairOfWords.containsKey(b+a))
		{
			if(pairOfWords.containsKey(a+b))
			{
				Integer ab = pairOfWords.get(a+b);
				pairOfWords.put(a+b, ++ab);
			}
			else{
				Integer ba = pairOfWords.get(b+a);
				pairOfWords.put(b+a, ++ba);
			}
		}
		else{
			pairOfWords.put(a+b, 0);
		}
	}

	public int getFeatureSize() {
		return this.pairOfWords.size();
	}

}
